10 SYS700 1000 ;******************************** 1010 ;* * 1020 ;* SIMULATING A TRAP WITH BRK * 1030 ;* -------------------------- * 1040 ;* * 1050 ;* * 1060 ;* BRK VECTOR IS DIVERTED SO * 1070 ;* THAT "INVISIBLE" SUBROUTINES * 1080 ;* CAN BE CALLED. * 1090 ;* * 1100 ;* * 1110 ;* - BY TOM HUGHES V022287 - * 1120 ;* * 1130 ;******************************** 1140 ; 1150 ;C64 EQUATES 1160 ; 1170 CBINV = $0316 ;BRK VECTOR (2) 1180 CHROUT = $FFD2 ;OUTPUT A CHAR 1190 CLRCHN = $FFCC ;I/O TO DEFAULTS 1200 GETIN = $FFE4 ;INPUT A CHAR 1210 MEMORY = $8D ;TEMP STORAGE (2) 1220 OLDBRK = $8B ;STORAGE FOR STANDARD BRK (2) 1230 STACK = $0100 ;65XX STACK LOCATION 1240 TIDYUP = $FEBC ;RECOVER FROM INTERRUPT 1250 *= $C000 ;SYS 32768 1260 ;------------------------------ 1270 ;SET BRK VECTOR TO OUR ROUTINE 1280 ;------------------------------ 1290 ;IN ACTUAL USE, THIS WOULD BE A SUBROUTINE 1300 ;CALLED ONCE TO DIVERT THE BRK VECTOR. 1310 ; 1320 JSR CLRCHN 1330 SEI ;DISABLE INTERRUPTS 1340 LDX CBINV 1350 LDY CBINV+1 1360 STX OLDBRK ;SAVE THE OLD BRK VECTOR 1370 STY OLDBRK+1 1380 LDX #NEWBRK 1400 STX CBINV 1410 STY CBINV+1 1420 CLI ;ENABLE INTERRUPTS 1430 ; 1440 ;------------------------------ 1450 ;DEMO BRK HANDLER 1460 ;------------------------------ 1470 ; 1480 ;THIS IS JUST AN EXAMPLE OF HOW YOU 1490 ;WOULD USE BRK FROM WITHIN A PROGRAM 1500 ; 1510 DEMO5 LDY #0 1520 DEMO10 LDA PROMPT,Y ;PRINT "NUMBER?" 1530 BEQ DEMO20 1540 JSR CHROUT 1550 INY 1560 BNE DEMO10 1570 DEMO20 JSR GETIN ;CHECK THE KEYBOARD 1580 CMP #3 ;(IF STOP KEY, QUIT) 1590 BEQ QUIT 1600 CMP #"1" ;FOR NUMBERS 1 THRU 3 1610 BCC DEMO20 1620 CMP #"4" 1630 BCS DEMO20 1640 JSR CHROUT 1650 AND #%00001111 ;MAKE # HEX 1 - 3 1660 STA TRPNM ;SAVE IN OUR OWN PROGRAM 1670 LDA #13 ;PRINT A CARRIAGE GOSUB 1680 JSR CHROUT 1690 BRK ;EXECUTE TRAP 1700 TRPNM .BYT 0 ;(TRAP #) 1710 JMP DEMO5 ;AFTER BRK, PRG CONTINUES HERE 1720 ; 1730 QUIT SEI 1740 LDX OLDBRK 1750 LDY OLDBRK+1 1760 STX CBINV 1770 STY CBINV+1 1780 CLI 1790 RTS ;BACK TO BASIC 1800 ; 1810 PROMPT .BYT 13,13 1820 .ASC "NUMBER (1 - 3)? " 1830 .BYT 0 1840 ;============================== 1850 ;NEW BRK ROUTINE 1860 ;============================== 1870 ; 1880 ;ENTRY (1) INTERRUPTS DISABLED (EXCEPT NMI) 1890 ; SO JIFFY CLOCK IS OFF. 1900 ; 1910 ;(2) ON ENTRY STACK LOOKS LIKE THIS... 1920 ; (ASSUMING OLD SP WAS AT $F6) 1930 ; 1940 ; $01F6 <- OLD SP 1950 ; $01F5 PCH (STACK+6) 1960 ; $01F4 PCL (STACK+5) 1970 ; $01F3 SR (STACK+4) 1980 ; $01F2 .A (STACK+3) 1990 ; $01F1 .X (STACK+2) 2000 ; $01F0 .Y (STACK+1) 2010 ; $01EF <- CURRENT SP 2020 ; 2030 ;(3) EXPECTS TRAP # AFTER BRK 2040 ; (THIS LOCATION CAN BE FOUND BY 2050 ; USING THE PC SAVED ON STACK -1.) 2060 ; 2070 NEWBRK TSX ;GET CURRENT SP TO .X 2080 LDA STACK+6,X ;TO FIND PC-HIGH 2090 STA MEMORY+1 2100 LDA STACK+5,X ;AND PC-LOW ON THE STACK 2110 STA MEMORY ;SAVE THIS ADDRESS 2120 BNE NEW10 ;AND SUBTRACT -1 FROM IT 2130 DEC MEMORY+1 ;SO WE CAN LOCATE TRAP # 2140 NEW10 DEC MEMORY 2150 LDY #0 2160 LDA (MEMORY),Y ;GET TRAP # 2170 TAY ;ADJUST IT SO 1-3 2180 DEY ;IS NOW 0-2 2190 TYA 2200 ASL A ;MULTIPLY THIS # BY 2 2210 TAY 2220 LDA TABLE,Y ;AND USE IT TO LOOK UP 2230 STA MEMORY ;TRAP ADDRESSES 2240 INY 2250 LDA TABLE,Y 2260 STA MEMORY+1 2270 JMP (MEMORY) ;(null) TO A TRAP ROUTINE 2280 ; 2290 ;TRAP ADDRESSES 2300 ; 2310 TABLE .WORD TRAP1 2320 .WORD TRAP2 2330 .WORD TRAP3 2340 ; 2350 ;////////////////////////////// 2360 ;DEMO TRAP ROUTINES 2370 ;////////////////////////////// 2380 ; 2390 TRAP1 LDA #"1" 2400 JSR CHROUT 2410 JMP TIDYUP ;MUST END WITH THIS 2420 ; 2430 TRAP2 LDA #"2" 2440 JSR CHROUT 2450 JMP TIDYUP 2460 ; 2470 TRAP3 LDA #"3" 2480 JSR CHROUT 2490 JMP TIDYUP 2500 .END